DefConst ( 'k_AddrFrom822Func, func(addr822)
	begin
	local i;
	if not addr822 then addr822 := "?????";

	addr822 := TrimString ( addr822 );

	try 
		local temp822 := Clone ( addr822 );
		if BeginsWith ( temp822, "\"" ) then
			temp822[0] := $\u0020;

		if EndsWith ( temp822, "\"" ) then
			temp822[StrLen(temp822) - 1] := $\u0020;

		temp822 := TrimString ( temp822 );

		local nameF :=
			{
			name: { first: Clone(k_EmptyString), last: temp822, },
			email: Clone ( temp822 ),
			};

		SetClass ( nameF.email, '|string.email.internet| );

		local namePart := k_EmptyString;
		local closePos;
		local spacePos;
		// LRT - 96/11/16 3:26 AM
		// test was too simple to cope with
		// "Bruce Thompson <bruce@newton.apple.com> (by way of rcampos@idirect.com (Robert"
		//local bracePos := EndsWith ( addr822, ">" )
		local bracePos := EndsWith ( addr822, ">" )
			or ( StrPos ( addr822, "<", 0 ) and StrPos ( addr822, ">", 0 ) );
		local parenPos := StrPos ( addr822, "(", 0 );

		if bracePos then
			begin
			// ADDR: "John Doe" <jondoe@place.com>

			bracePos := 0;
			for i := StrLen(addr822) to 1 by -1 do
				begin
				if addr822[i-1] = $< then
					begin
					bracePos := i-1;
					break;
					end;
				end;
			closePos := CharPos ( addr822, $>, bracePos );
			local addrPart := Substr ( addr822, bracePos+1, closePos - bracePos - 1 );
			nameF.email := addrPart;

			// try to strip off the quoted name

			if addr822[0] = $" then
				begin
				for i := StrLen(addr822) to 1 by -1 do
					begin
					if addr822[i-1] = $" then
						begin
						closePos := i-1;
						break;
						end;
					end;
				local namePart := Substr ( addr822, 1, closePos - 1 );
				end;
			else
				begin
				for i := bracePos to 1 by -1 do
					begin
					if addr822[i-1] = $\20 then
						begin
						closePos := i-1;
						break;
						end;
					end;
				local namePart := Substr ( addr822, 0, closePos );
				end;
			end;

		else if parenPos then
			begin
			// ADDR: jondoe@place.com (John Doe)
			// ADDR: jondoe@place.com (John Q. Doe)
			// ADDR: jondoe@place.com (John)

			parenPos := 0;
			for i := StrLen(addr822) to 1 by -1 do
				begin
				if addr822[i-1] = $( then
					begin
					parenPos := i-1;
					break;
					end;
				end;
			closePos := CharPos ( addr822, $), parenPos );
			namePart := Substr ( addr822, parenPos+1, closePos - parenPos - 1 );

			nameF.email := Substr ( addr822, 0, parenPos - 1 );
			end;


		if StrFilled ( namePart ) then
			begin
			spacePos := -1;

			// LRT - 97/04/22 2:13 AM
			// WAS:
			// if CharPos ( namePart, $\20, 0 ) then
			// NEW:
			if ( spacePos := CharPos ( namePart, $\2C, 0 ) ) then
				begin
				// has a comma therefore is "Last, First"
				nameF.name.last  := Substr ( namePart, 0, spacePos );
				nameF.name.first := Substr ( namePart, spacePos+1, 9999 );
				end;
			else if CharPos ( namePart, $\20, 0 ) then	// END OF NEW  97/04/22
				begin
				for i := StrLen(namePart) to 1 by -1 do
					begin
					if namePart[i-1] = $\20 then
						begin
						spacePos := i - 1;
						break;
						end;
					end;
				nameF.name.last := Substr ( namePart, spacePos+1, 9999 );
				nameF.name.first  := Substr ( namePart, 0, spacePos );
				end;
			else
				begin
				nameF.name.last := namePart;
			//	nameF.name.first := Clone(k_EmptyString);
				end;
			end;


		if bracePos or parenPos then
			begin
			StrReplace ( nameF.name.first, "\"", k_EmptyString, nil );
			StrReplace ( nameF.name.last,  "\"", k_EmptyString, nil );

			// LRT - 97/04/22 1:49 AM
			// undo opt-quotes from "k_822QuotesToOptsFunc"
			StrReplace ( nameF.name.first, "\u005C00A8", "\u0022", nil );
			StrReplace ( nameF.name.last,  "\u005C00A8", "\u0022", nil );

			TrimString ( nameF.name.first );
			TrimString ( nameF.name.last );

			if nameF.email then
				begin
				StrReplace ( nameF.email, " ", k_EmptyString, nil );
				TrimString ( nameF.email );
				SetClass   ( nameF.email, '|string.email.internet| );
				end;
			end;

	onexception |evt.ex| do
		begin
		nameF.name.first := k_EmptyString;
		nameF.name.last  := addr822;
		nameF.email      := Clone ( addr822 );
		if nameF.email then
			begin
			StrReplace ( nameF.email, " ", k_EmptyString, nil );
			end;
		end;

	nameF;
	end );
